<?php // $Id: sharpobj_port_client.php,v 1.4 2006/07/02 20:15:16 alex Exp $
// Клиентский порт для обращения к базе данных

// Интерфейс клиентского порта
abstract class sharpobj_port_client
{
	// Выполнить запрос
    abstract function query($func);
	// Проверка обратной связи
	abstract function testlink($class,$portname=null);
}

// Базовый класс клиентского порта
class sharpobj_port_client_int extends sharpobj_port_client
{
    protected  $port_server = array();
    protected  $port_primary = null;
    function portAdd($name,$port)
    {
        $this->port_server[$name] = $port;
        if (is_null($this->port_primary))
        {
            $this->port_primary = $name;
        }
    }
    /**
     * Возвращает ссылку на объект серверного порта
     *
     * @param string $name
     * @return sharpobj_port_server
     */
    private function portLink($name=null)
    {
        if (is_null($name))
        {
            $name = $this->port_primary;
        }
        return $this->port_server[$name];
    }
    
    /**
     * Исполнить запрос
     *
     * @param string $class - имя процессора-обработчика запроса
     * @param string $func - имя функции
     * @param sharpobj_data_interface_item $dataobj - объект с данными (необ.)
     * @param string $portname - имя порта (необ.)
     * @return sharpobj_data_interface_item
     */
    function query($func)
    {
        // Получаем аргументы, начиная с первого
    	$args = array();
    	for ($i=1;$i<func_num_args();++$i)
    	{
    		$args[] = func_get_arg($i);
    	}
    	
        // Исполнить запрос
        $portname = null;
        $port = $this->portLink($portname);
        if ($port instanceof sharpobj_port_server)
        {
            $result = $port->query($func,$args);
        }else
        {
            $result = sharpobj_error('portserver_class_name',"Порт {$portname} не зарегистрирован"
							,"Неправильный идентификатор класса порта сервера или при регистрации передан неправильный объект",2);
        }
        // debug_print_backtrace();
		// Проверяем результат на ошибку
		if (sharpobj_iserror($result))
		{
			// Возвращено сообщение об ошибке
			mst_error('Ошибка запроса','При запросе к sharpobj_port_server'
					.' произошла ошибка "'.$result->get('plain','name').'" '
					.' ('.$result->get('plain','about').')',1);
			return false;
		}
		return $result;
        
    }
	 /**
     * Перегружаем все функции, для возможности прямого обращения к приватным методам
     */
    function __call($func,$args)
    {
        // Исполнить запрос
        $result = $this->action($func,$args);;

        // Исполнить запрос
        $port = $this->portLink(null);
        if ($port instanceof sharpobj_port_server)
        {
            $result = $port->query($func,$args);
        }else
        {
            $result = sharpobj_error('portserver_class_name',"Порт {$portname} не зарегистрирован"
							,"Неправильный идентификатор класса порта сервера или при регистрации передан неправильный объект",2);
        }
        // debug_print_backtrace();
		// Проверяем результат на ошибку
		if (sharpobj_iserror($result))
		{
			// Возвращено сообщение об ошибке
			mst_error('Ошибка запроса','При запросе к sharpobj_port_server'
					.' произошла ошибка "'.$result->get('plain','name').'" '
					.' ('.$result->get('plain','about').')',1);
			return false;
		}
		return $result;
    }
    function testlink($class,$portname=null)
    {
		// Объявляем объект
		$o = new sharpobj_data_item_int();
		$o->set('plain',7);
        // Исполнить запрос
        $o2 = $this->query($class,'tls_lo',$o,$portname);
		if ($o->get('plain')==7)
		{
			return true;
		}
		return false;
    }
    function __construct($name=null,$port=null)
    {
        if (!is_null($name) AND !is_null($port))
        {
            $this->portAdd($name,$port);
        }
    }
}

?>